﻿#ifndef __SS_ACTOR_MGR_H__
#define __SS_ACTOR_MGR_H__
#include "ssActor.h"
#include <map>
#include "container/ssList.h"
#include "thread/threadLock/ssAtomicLock.h"
#include "tools/ssIDAlloter.h"
#include "ssActorThreadPool.h"

using namespace std;

namespace StarSeeker
{

class ssActorMgr : public ssActorThreadPool
{
public:
	ssActorMgr();
	~ssActorMgr();
	//创建工作线程，必须在线程未启动状态
	void CreatWorkThreads(u32 count);
	//新建Actor
	u32 AddActor(ssActor* pActor);
	//丢弃Actor
	void DiscardActor(u32 actorID);
	//发送消息
	bool PostMsg(bool isNotify, u32 actorID, ssMsg_s &m);
	bool PostMsg(bool isNotify, u32 actorID, u32 msgID, u32 subID, ulint param1, ulint param2, ulint param3);
	//清空内存，要先让线程池结束运行
	void Clear();
	//删除丢弃的Actor，定时执行
	void DeleteActor();
	//获取一个待处理的Actor，主要由工作线程调用
	ssActor* PopPendingActor();
	//待处理个数
	ulint GetPendingCount();
	//传入一个待处理的Actor，主要由工作线程调用
	void PushPendingActor(u32 actorID);

protected:
	map<u32, ssActor*>		m_allActor;		//所有的
	ssList<u32>				m_pendingList;	//待处理的
	ssList<ssActor*>		m_discardList;	//丢弃的
	ssAtomicLock			m_lock;
	ssCumulationID<u32>		m_iDAlloter;
};

}
#endif
